#include "utils.hpp"

double pow( const Real& r, unsigned long y )
{
	return pow( r.toDouble(), y );
}

/*
 * Interpreta los parámetros
 */
bool parseParams( int argc, char** argv, Iteration &iterations, Iteration& pcount, Iteration& icount, bool& output )
{

	bool error = false;

	for( int i = 1 ; i < argc && !error ; i++ )
	{
		if( argv[i][0] == '-' )
			switch( argv[i][1] )
			{
				case 'i':
					error = i+1 >= argc;
					if( !error )
						iterations = atoi(argv[++i]);
					break;
				case 'j':
					error = i+1 >= argc;
					if( !error )
						icount = atoi(argv[++i]);
					break;
				case 'd':
					error = i+1 >= argc;
					if( !error )
						Real::precision( atoi(argv[++i]) );
					break;
				case 'c':
					error = i+1 >= argc;
					if( !error )
						pcount = ( atoi(argv[++i]) );
					break;
				case 't':
					Real::roundNumber = false;
					break;
				case 'o':
					output = true;
					break;
				default:
					error = true;
					break;
			}
	}

	if( error )
	{
		cerr << "Uso: "     << argv[0] << " [opciones]" << endl
		     << "Opciones:" << endl
			 << "\t-i I\tejecuta el algoritmo con I iteraciones" << endl
			 << "\t-j J\tejecuta el algoritmo desde I hasta J iteraciones" << endl
			 << "\t-d T\tusa aritmética de T dígitos" << endl
			 << "\t-c C\tincrementa la cantidad de dígitos hasta C dígitos y" << endl
			 <<     "\t\tcorre el algoritmo una vez por cantidad de dígitos" << endl
			 << "\t-t  \tutiliza truncamiento como método de aproximación" << endl
			 << "\t-o  \timprime los datos preparados para graficar" << endl;
	}
	else
	{
		
		if( pcount <= Real::precision() )
			pcount = Real::precision();
		if( icount <= iterations )
			icount = iterations;

		if( output )
		{
			cout << "# Comando: ";
			for( int i = 0 ; i < argc ; i++ )
				cout << argv[i] << " ";
			cout << endl;

			cout << "# Iteraciones = " << iterations;
			if( icount > iterations )
				cout << ".." << icount;
			cout << " ; ";

			cout << "Dígitos = " << Real::precision();
			if( pcount > Real::precision() )
				cout << ".." << pcount;
			cout << " ; ";

			cout << (Real::roundNumber?"Redondeando":"Truncando")
			 << endl;
		}

	}

	return error;

}

